#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : 字典及其操作.py
@CreateTime :2021/11/10 20:56 
@Author : 许嘉凯
@Version  : 1.0
@Description : 
"""
"""
字典

概念
	无序的, 可变的键值对集合
定义
	方式1
		{key: value, key: value...}
		例如
			{"name": "sz", "age": 18}
	方式2
		fromkeys(S, v=None)
			静态方法
				类和对象都可以调用
			类调用
				dict.fromkeys("abc", 666)
					{'a': 666, 'c': 666, 'b': 666}
				此处的dict, 是指字典类型
			对象调用
				dic.fromkeys("abc", 666)
					{'a': 666, 'c': 666, 'b': 666}
				此处的dic, 是实例化的字典对象
	注意
		key不能重复
			如果重复
			后值会把前值覆盖
		key必须是任意不可变类型
			例如
				可变
					列表
					字典
					可变集合
					...
				不可变
					数值
					布尔
					字符串
					元组
					...
		原因
			Python的字典, 采用哈希(hash)的方式实现
			简单存储过程
				初始化一个表格, 用来存放所有的值
					这个表格称之为"哈希表"
					暂且可理解为我们所学的 "列表"
				在存储一个键值对的时候, 会作如下操作
					根据给定的key, 通过某些操作, 得到一个在"哈希表"中的索引位置
						把key通过 "哈希函数" 转换成一个整型数字
							称为 "哈希值"
						将该数字对数组长度进行取余，取余结果就当作数组的下标
						如果产生了"哈希冲突"
							比如, 两个不同的key, 计算出来的索引, 是同一个
							则采用"开发寻址法"
								通过探测函数查找下一个空位
					根据索引位置, 存储给定的"值"
			简单查找过程
				再次使用哈希函数将key转换为对应的列表的索引，并定位到列表的位置获取value
存在意义
	可以通过key, 访问对应的值, 使得这种访问更具意义
		person["name"]
		表述的是获取一个人的姓名
	查询效率得到很大提升
		可想象"汉字字典"的使用方式
			直接根据指定的key找到对应的页码, 从而找到这个汉字
			不需要一页一页的翻着找
常用操作
	增
		dic[key] = value
			当key在原字典中不存在时, 即为新增操作
	删
		del  dic[key]
			key, 必须要存在
		dic.pop(key[, default])
			删除指定的键值对, 并返回对应的值
			如果key, 不存在, 那么直接返回给定的default值; 不作删除动作
			如果没有给定默认值, 则报错
				
		dic.popitem()
			删除按升序排序后的第一个键值对, 并以元组的形式返回该键值对
			如果字典为空, 则报错
				
		dic.clear()
			删除字典内所有键值对
				返回None
			注意, 字典对象本身还存在, 只不过内容被清空
				注意和del的区别
	改
		只能改值, 不能改key
		修改单个键值对
			dic[key] = value
				直接设置, 如果key不存在, 则新增, 存在则修改
		批量修改键值对
			oldDic.update(newDic)
				根据新的字典, 批量更新旧字典中的键值对
				如果旧字典没有对应的key, 则新增键值对
	查
		获取单个值
			方式1
				dic[key]
					如果key, 不存在, 会报错
						
			方式2
				dic.get(key[, default])
					如果不存在对应的key, 则取给定的默认值default
					如果没有默认值,  则为None
						但不会报错
					但是, 原字典不会新增这个键值对
			方式3
				dic.setdefault(key[,default])
					获取指定key对应的值
					如果key不存在, 则设置给定默认值, 并返回该值
					如果默认值没给定
						则使用None代替
		获取所有的值
			dic.values()
		获取所有的键
			dic.keys()
		获取字典的键值对
			dic.items()
		遍历
			for in
			for x,y in info.items()
		注意
			Python2.x和Python3.x版本之间关于获取键, 获取值, 获取item, 之间的区别
				Python2.x 直接是一个列表
					可通过下标进行获取指定元素
				Python3.x 中是Dictionary view objects
					优势
						当字典发生改变时, view objects会跟着发生改变
					转换成列表使用
						list(result)
					转换成迭代器
						iter(result)
					也可以直接被遍历
			在Python2.x中提供了如下方法
				viewkeys()
				viewvalues()
				viewitems()
				作用如同Python3.x中的
					Dictionary view objects
	计算
		len(info)
			键值对的个数
	判定
		x in dic
			判定dic中的key, 是否存在x
		x not in dic
			判定dic中的key, 是否不存在x
		dic.has_key(key)
			已过期, 建议使用in来代替
"""